#include "../include/Batiment.h"
#include "../include/Entites.h"

Batiment::Batiment(  int ID_Owner, CarracteristiquesElement *c) : Element( ID_Owner,c)
{
	this->ptVieActuel = 0;
	construit = false;
}

bool Batiment::estConstruit()
{
	return construit;
}

void Batiment::construire( int pointsConstruction)
{
	if( !construit )
		gagnerVie(pointsConstruction);
	else
		std::cout<<"Erreur : on essaie de construire un batiment deja construit :"<<std::endl;

	if( ptVieActuel >= getVieMax() )
		construit = true;
}

void Batiment::reparer( int pointsReparation)
{
	gagnerVie(pointsReparation);
}

std::vector<ENTITE> Batiment::getUniteProductible() const
{
    return unitesProductibles;
}

void Batiment::setCoefTemps( float tps)
{
	coefReductionTemps = tps;
}

float Batiment::getCoefTemps() const
{
	return coefReductionTemps;
}

Entite* Batiment::produire()
{
	
	if( !construit )
		return NULL;

	Entite *e=NULL;
	if( file.size() > 0 && clock() > finProchaineUnite )
	{
		e = file[0];
		file.erase( file.begin());
			// Si il ya une autre unité dans la file, on MAJ le temps
		if( file.size() > 0 )
		{
			finProchaineUnite = clock () + file[0]->getTempsConstruction() * CLOCKS_PER_SEC ;
		}
	}
	return e;
}

bool Batiment::unitePrete()
{
    #if VERBOSE
		std::cout<<"Temps :"<<clock()<<std::endl;
    #endif
    
	if( file.size() > 0 && clock() > finProchaineUnite )
		return true;
	return false;
}

int Batiment::getPourcentageConstruction()
{
	if( !construit)
		return (int)(((float)ptVieActuel)/(float)getVieMax() *100);
	else
		return 100;
}

bool Batiment::estUniteProductible(  ENTITE nomUniteAProduire)
{
	for( unsigned int i=0; i<unitesProductibles.size(); i++)
		if( nomUniteAProduire  == unitesProductibles[i])
			return true;

	return false;
}

void Batiment::produireUnite( ENTITE nom, CarracteristiquesEntite *c )
{
	unsigned int i=0;
	while( unitesProductibles[i] != nom ){ i++; }
	if( unitesProductibles[i] == nom )
	{
		switch( nom )
		{
			case GUERRIER :
				file.push_back( new Guerrier(getID_Owner(), c));
				break;
			case VILLAGEOIS :
				file.push_back( new Villageois(getID_Owner(), c));
				break;
		}
		if( file.size() == 1 )
			finProchaineUnite = clock () + c->getTempsConstruction() * CLOCKS_PER_SEC ;
	}
}
